#include "clipp.h"
#include <iostream>
using namespace clipp;

#define VERSION_BUILD_TIME "$WCNOW$"

typedef struct _app_options {
    bool showVersion;
    std::string config;
} app_options_t;

int main(int argc, char **argv)
{
    app_options_t app_options;

    //     clipp::option("-v", "--version")：定义一个选项，用户可以通过 -v 或 --version 来指定
    // .set(options.showVersion)：当用户指定这个选项时，将 options.showVersion 变量设置为 true
    // % "show version"：为这个选项添加帮助描述文本
    auto cli = (
        clipp::option("-v", "--version").set(app_options.showVersion) % "show version",
        clipp::option("-c", "--config") & clipp::value("PROPERTIES", app_options.config) % " properties file path",
        // 这个是在clipp解析时直接输出，使用call方法
        clipp::option("-t", "--test").call([](){
            std::cout << "this is a test" << std::endl;
        }) % "this is test ouput when -t or --test is specified"
    );

    /**
     * clipp::parse - 这是 clipp 库的核心函数，用于解析命令行参数
     * argc, argv - 从 main 函数传入的命令行参数计数和参数数组
     * cli - 之前定义的命令行接口规范（包含 -v 和 -c 选项）
     */
    auto result = clipp::parse(argc, argv, cli);
    if (!result) {
        // 处理解析错误
        std::cerr << clipp::make_man_page(cli, argv[0]) << std::endl;
        return false;
    }
    
    // 专门一个函数处理是更优雅的方式
    if (app_options.showVersion){
        std::cout << "version: 1.0.0" << std::endl;
        std::cout << "build time: " << VERSION_BUILD_TIME << std::endl;
    }
    std::cout << "config: " << app_options.config << std::endl;
}